package fr.esisar.p2014.cs420.nsmwnr;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.eclipse.swt.events.DisposeListener;
import org.eclipse.swt.events.DisposeEvent;

public class InfosClient {
	Shell shell = null;
	Display display = MainApp.display;
	private Text textNom;
	private Text textPrenom;
	private Text textMdp;
	private Text textMail;
	private Text textAdresse;

	Statement stmt = null;
	Connection conn = null;
	
	/**
	 * Cette fonction initialise la fenêtre si elle n'existe
	 * pas sur le bureau, ou la remet au premier-plan dans
	 * le cas contraire et actualise ses données.
	 */
	public void setActive(){
		if(shell == null || shell.isDisposed())
			run();
		else{
			rafraichir();
			shell.setActive();
		}
	}

	/**
	 * Open the window.
	 * @wbp.parser.entryPoint
	 */
	public void run() {
		shell = new Shell(display, SWT.SHELL_TRIM & ~SWT.RESIZE & ~SWT.MAX);		// Crée une fenêtre non redimensionnable
		shell.addDisposeListener(new DisposeListener() {
			public void widgetDisposed(DisposeEvent arg0) {
				MainApp.consult.setActive();
			}
		});
		shell.setSize(400, 210);
		shell.setImage(MainApp.icone);
		shell.setText("Informations client");
		shell.setLocation(display.getBounds().width / 2 - shell.getBounds().width / 2, display.getBounds().height / 2 - shell.getBounds().height / 2);
		
		Label label = new Label(shell, SWT.NONE);
		label.setText("Nom :");
		label.setBounds(64, 13, 33, 15);
		
		textNom = new Text(shell, SWT.BORDER);
		textNom.setBounds(103, 10, 284, 21);
		
		textPrenom = new Text(shell, SWT.BORDER);
		textPrenom.setBounds(103, 37, 284, 21);
		
		Label label_1 = new Label(shell, SWT.NONE);
		label_1.setText("Prénom :");
		label_1.setBounds(49, 40, 48, 15);
		
		Label label_2 = new Label(shell, SWT.NONE);
		label_2.setText("Mot de passe :");
		label_2.setBounds(20, 67, 77, 15);
		
		textMdp = new Text(shell, SWT.BORDER | SWT.PASSWORD);
		textMdp.setBounds(103, 64, 284, 21);
		
		textMail = new Text(shell, SWT.BORDER);
		textMail.setBounds(103, 91, 284, 21);
		
		Label label_3 = new Label(shell, SWT.NONE);
		label_3.setText("Adresse mail :");
		label_3.setBounds(22, 94, 75, 15);
		
		Label label_4 = new Label(shell, SWT.NONE);
		label_4.setText("Adresse postale :");
		label_4.setBounds(10, 121, 88, 15);
		
		textAdresse = new Text(shell, SWT.BORDER);
		textAdresse.setBounds(103, 118, 284, 21);
		
		Button btnMettreJour = new Button(shell, SWT.NONE);
		btnMettreJour.addSelectionListener(new SelectionAdapter() {
			@Override
			public void widgetSelected(SelectionEvent arg0) {
				try {
					update ();
				} catch (SQLException e) {
					try {
						stmt.close();
						conn.rollback();
						conn.close();
					} catch (SQLException e1) {
						e1.printStackTrace();
					}

					e.printStackTrace();
					MainApp.erreurBase("Impossible de mettre à jour les informations");
				}
			}
		});
		btnMettreJour.setBounds(287, 147, 100, 25);
		btnMettreJour.setText("Mettre à jour");

		rafraichir();
		shell.open();
		shell.layout();
	}

	/**
	 * Met à jour les informations de la fenêtre
	 */
	public void rafraichir() {
		if (MainApp.idClient == 0) {
			shell.dispose();
			return;
		}
		
		textNom.setText(MainApp.nom);
		textPrenom.setText(MainApp.prenom);
		textMdp.setText("");
		textMail.setText(MainApp.mail);
		textAdresse.setText(MainApp.adresse);
	}

	/**
	 * Cette fonction retourne vrai si la fenêtre est déjà
	 * visible à l'écran
	 */
	public boolean estLance(){
		return shell != null && !shell.isDisposed();
	}
	
	/**
	 * Met à jour les informations du client
	 * @throws SQLException
	 */
	private void update() throws SQLException {
		Connection conn = JDBC.getInstance().getConnection();
		conn.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
		stmt = conn.createStatement();
		
		// Avertissement si on essaye de changer le mot de passe
		int answer = -1;
		if (textMdp.getText().trim() != "") {
			MessageBox dialog = new MessageBox(shell, SWT.ICON_WARNING | SWT.YES | SWT.NO);
			dialog.setText("Modifier le mot de passe");
			dialog.setMessage("Vous allez modifier votre mot de passe,\nEtes-vous sûr de vous ?");
			answer = dialog.open();
		}
		
		// Requête de mise à jour calculée de manière conditionnelle
		if (answer == -1 || answer == SWT.YES) {
			// On regarde ce qu'il faut modifier
			boolean upMail = !textMail.getText().replace('\'', '_').trim().equalsIgnoreCase(MainApp.mail) && !textMail.getText().trim().equals("");
			boolean upAddr = !textAdresse.getText().replace('\'', '_').trim().equals(MainApp.adresse) && !textAdresse.getText().trim().equals("");
			boolean upNom = !textNom.getText().replace('\'', '_').trim().equals(MainApp.nom) && !textNom.getText().trim().equals("");
			boolean upPren = !textPrenom.getText().replace('\'', '_').trim().equals(MainApp.prenom) && !textPrenom.getText().trim().equals("");
			boolean upMdp = !textMdp.getText().trim().equals("");
			
			// S'il faut mofifier le mail, on vérifie que c'est possible
			if (upMail) {
				ResultSet rset = stmt.executeQuery("SELECT mail FROM Client WHERE mail = '" + textMail.getText().toLowerCase().replace('\'', '_').trim() + "'");
				if (rset.next()) {
					MessageBox dialog = new MessageBox(shell, SWT.ICON_ERROR | SWT.OK);
					dialog.setText("Mail invalide");
					dialog.setMessage("L'adresse mail choisie est déjà utilisée !");
					dialog.open();
					return;
				}
				rset.close();
			}
			
			if (upMail || upNom || upPren || upMdp || upAddr) {
				stmt.executeUpdate("UPDATE Client"
						+ " SET mail = '" + ((upMail)?  textMail.getText().toLowerCase().replace('\'', '_').trim() : MainApp.mail) + "'"
						+ ", adresse = '" + ((upAddr)? textAdresse.getText().replace('\'', '_').trim() : MainApp.adresse) + "'"
						+ ", nom = '" + ((upNom)? textNom.getText().replace('\'', '_').trim() : MainApp.nom) + "'"
						+ ", prenom = '" + ((upPren)? textPrenom.getText().replace('\'', '_').trim() : MainApp.prenom) + "'"
						+ ", motDePasse = " + ((upMdp)? "'" + textMdp.getText().replace('\'', '_').trim() + "'" : "(SELECT motDePasse FROM Client WHERE idClient = " + MainApp.idClient + ")")
						+ " WHERE idClient = " + String.valueOf(MainApp.idClient)
						);
				
				conn.commit();
		
				// Recherche de modifications et mise à jour des informations
				if (upMail) MainApp.mail = textMail.getText().toLowerCase().replace('\'', '_').trim();
				if (upAddr) MainApp.adresse = textAdresse.getText().replace('\'', '_').trim();
				if (upNom) MainApp.nom = textNom.getText().replace('\'', '_').trim();
				if (upPren) MainApp.prenom = textPrenom.getText().replace('\'', '_').trim();
			
				// Message de réussite et mise à jour des affichages
				MainApp.rafraichir();
				
				MessageBox dialog = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
				dialog.setText("Mise à jour");
				dialog.setMessage("Vos informations personnelles ont correctement été mises à jour !");
				dialog.open();
				
				shell.dispose();
				MainApp.consult.setActive();
			} else {
				MessageBox dialog = new MessageBox(shell, SWT.ICON_INFORMATION | SWT.OK);
				dialog.setText("Mise à jour");
				dialog.setMessage("Aucun changement n'a été effectué !");
				dialog.open();
			}
		}
		stmt.close();
		conn.close();
	}
}
